package org.jgs1904.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;

/**
 * @author 墨苍璃
 * @date 2022年06月30日22时06分
 * <p>
 * 自定义realm
 */
public class MyRealm extends AuthenticatingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        System.out.println("执行认证");

        //用户名
        String username = token.getPrincipal().toString();
        //密码
        String pwd = new String((char[]) token.getCredentials());
        System.out.println(username + "  " + pwd);

        /**
         * 先从数据库查询select * from user where username=? 查看用户名是否存在
         * 假设用户名为admin时能从数据库中查询出来
         */
        if ("admin".equals(username)) {
            /**
             * 根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwd
             * 此处需要注意，第二个参数是从数据库查询出来的密码，而不是传递过来的密码。(数据密码是加密的)
             */
            String password = "pwd";

            //第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字。
            AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), password, "realmname");

            //shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。
            return info;
        }
        //返回null说明用户名不存在。
        return null;
    }

}
